package com.system.helper;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * 
 * @author kaifa002
 *
 */
public class GeneratorUtils {

	// 数据库连接url
	private static String dbUrl;
	// 数据库驱动
	private static String dbDriverName;
	// 数据库连接名称
	private static String dbUserName;
	// 数据库连接密码
	private static String dbPassword;

	public static void main(String[] args) {
		autoGenerator();
	}

	public static void autoGenerator() {
		loadDbProperty();
		AutoGenerator autoGenerator = new AutoGenerator();
		autoGenerator.setDataSource(getDataSourceConfig());
		autoGenerator.setGlobalConfig(getGlobalConfig());
		autoGenerator.setPackageInfo(getPackageInfo());
		autoGenerator.setStrategy(getStrategyConfig());
		autoGenerator.execute();
	}

	/**
	 * 设置数据源
	 * 
	 * @return
	 */
	public static DataSourceConfig getDataSourceConfig() {
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setSchemaName("public");
		dsc.setDbType(DbType.MYSQL);
		dsc.setUrl(dbUrl);
		dsc.setDriverName(dbDriverName);
		dsc.setUsername(dbUserName);
		dsc.setPassword(dbPassword);
		return dsc;
	}

	/**
	 * 设置全局配置
	 * 
	 * @return
	 */
	public static GlobalConfig getGlobalConfig() {
		GlobalConfig gc = new GlobalConfig();
		String path = System.getProperty("user.dir");
		gc.setOutputDir(path + "/src/main/java");// 参数是一个目录，所以需要获取当前系统目录
		gc.setAuthor("sky");
		gc.setOpen(true);// 是否打开资源管理器
		gc.setFileOverride(true);// 是否覆盖已经生成的
		gc.setServiceName("%sService");// 去service的I前缀
		gc.setIdType(IdType.INPUT);// id生成策略
		gc.setDateType(DateType.ONLY_DATE);
		return gc;
	}

	/**
	 * 包配置
	 * 
	 * @return
	 */
	public static PackageConfig getPackageInfo() {
		PackageConfig pc = new PackageConfig();
		pc.setParent("com.lg");
		// pc.setModuleName("common");
		pc.setEntity("entity");
		pc.setMapper("mapper");
		pc.setService("service");
		pc.setController("controller");
		return pc;
	}

	/**
	 * 策略配置
	 * 
	 * @return
	 */
	public static StrategyConfig getStrategyConfig() {
		StrategyConfig strategy = new StrategyConfig();
		strategy.setNaming(NamingStrategy.underline_to_camel);// 下划线转驼峰命名
		strategy.setColumnNaming(NamingStrategy.underline_to_camel);
		// 设置映射的表名，多张表
		strategy.setInclude("user");

		strategy.setEntityLombokModel(true);// 是否启用lombok开启注解
		strategy.setLogicDeleteFieldName("isAction");// 设置逻辑删除字段

		// 时间自动填充配置
		TableFill startDate = new TableFill("startDate", FieldFill.INSERT);
		TableFill updateDate = new TableFill("updateDate", FieldFill.UPDATE);

		ArrayList<TableFill> list = new ArrayList<>();
		list.add(startDate);
		list.add(updateDate);
		strategy.setTableFillList(list);

		// 乐观锁配置
		strategy.setVersionFieldName("version");
		// rustful 格式

		strategy.setRestControllerStyle(true);

		return strategy;
	}

	// 3.5.2版本
//	public static void main1() {
//		FastAutoGenerator
//				.create("jdbc:mysql://localhost:3306/library?&characterEncoding=utf-8&userSSL=false", "root", "123456")
//				.globalConfig(builder -> {// 全局配置
//					builder.author("吉吉国王") // 设置作者
//							// .enableSwagger() // 开启 swagger 模式
//							.fileOverride() // 覆盖已生成文件
//							.outputDir("D://demo-library"); // 指定输出目录
//				}).packageConfig(builder -> {// 包配置
//					builder.parent("com.hh") // 设置父包名
//							.moduleName("demo") // 设置父包模块名
//							.pathInfo(Collections.singletonMap(OutputFile.xml, "D://demo-library"));// 设置mapperXml生成路径
//
//				}).strategyConfig(builder -> {// 策略配置
//					builder.addInclude("iot1002_book", "iot1002_bookinfo", "iot1002_exceptionmessage",
//							"iot1002_smokesensor", "iot1002_user") // 设置需要生成的表名
//							.addTablePrefix("iot1002_"); // 设置过滤表前缀
//				}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker 引擎模板，默认的是Velocity引擎模板
//				.execute();
//	}

	/**
	 * 加载数据量属性配置信息
	 */
	public static void loadDbProperty() {
		Properties props = new Properties();
		try {
			// java直接读取文件处理
			Resource resource = new ClassPathResource("/application.properties");
			props = PropertiesLoaderUtils.loadProperties(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
		dbUrl = props.getProperty("spring.datasource.url", "");
		dbDriverName = props.getProperty("spring.datasource.driverClassName", "");
		dbUserName = props.getProperty("spring.datasource.username", "");
		dbPassword = props.getProperty("spring.datasource.password", "");
	}

}